//package my.dao.daoImpl;
//
//import my.support.VoIODealer;
//import my.vo.voImpl.Book;
//
//import java.util.*;
//
///**
// * @author 星环
// * @date 2022/10/31 10:53:13
// * @description 书的Dao
// */
//public class BookDao {
//    // 用于计数最新的id
//    private static int idCounter = 1;
//    //用于处理list对文件的读取、存储
//    private final VoIODealer<Book> ioDealer;
//    //单例，能防止重复创建BookDao，读取数据
//    private static final BookDao bookDao = new BookDao();
//    //存储数据用
//    public static  List<Book> list;
//
//    /**
//     * 初始化list、ioDealer、更新计数器
//     */
//    private BookDao(){
//        list = new ArrayList<>();
//        ioDealer = new VoIODealer<>("books");
//        ioDealer.read(list,new Book());
//        updateIdCounter();
//    }
//
//    /**
//     * 因为计数器读取文件时不会更新，所以要手动更新一次
//     */
//    private void updateIdCounter() {
//        int maxid = 1;
//        for (Book book : list) {
//            if(book.getId() >= maxid){
//                maxid = book.getId() + 1;
//            }
//        }
//        idCounter = maxid;
//    }
//
//    /**
//     * 单例，返回自己的唯一实例
//     * @return 存储的实例
//     */
//    public static BookDao getInstance(){
//        return bookDao;
//    }
//
//
//    /**
//     * 每次实际插入一条数据前都调用一次，保证id自增不重复
//     * @return Book新的id
//     */
//    protected static int getNewId(){
//        return idCounter++;
//    }
//
//
//    /**
//     * 插入一条新的数据，并保存
//     * @param book 要加入的书
//     */
//    public void insert(Book book){
//
//        book.setId(getNewId());
//        list.add(book);
//
//    }
//
//    /**
//     * 删除一本书
//     * @param book 要删除的书
//     * @return 删除的书，或者没删掉，返回null
//     */
//    public Book delete(Book book){
//        Iterator<Book> iterator = list.iterator();
//        int delNum = 0;
//        while (iterator.hasNext()){
//            Book now = iterator.next();
//            if(now.equals(book)){
//                iterator.remove();
//
//                return now;
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 按id删除
//     * @param id 要删除的书的id
//     * @return 如果删掉了，书，否则null
//     */
//    public Book deleteById(int id){
//
//        Iterator<Book> iterator = list.iterator();
//        while (iterator.hasNext()){
//            Book now = iterator.next();
//            if(now.getId() == id){
//                iterator.remove();
//                return now;
//            }
//        }
//
//        return null;
//    }
//
//    /**
//     * 按名字删除，话说这些重复了三遍，我不会要写三遍注释吧
//     * 因为可能重名，返回被删掉的书的列表
//     * @param name 书名
//     * @return 被删掉书的列表，如果没有，size就是0
//     */
//    public List<Book> deleteByName(String name){
//
//        List<Book> books = new LinkedList<>();
//        Iterator<Book> iterator = list.iterator();
//        while (iterator.hasNext()){
//            Book now = iterator.next();
//            if(now.getName().equals(name)){
//                iterator.remove();
//                books.add(now);
//            }
//        }
//
//
//        return books;
//    }
//
//    /**
//     * 根据id更新书
//     *
//     * @param book 要更改的信息
//     */
//    public void updateById(Book book){
//
//        for (Book now : list) {
//            if (now.getId() == book.getId()) {
//                now.setInfo(book);
//
//                return;
//            }
//        }
//    }
//
//    /**
//     * 取得所有书
//     * @return 所有书的列表
//     */
//    public List<Book> getAll(){
//        return new ArrayList<>(list);
//    }
//
//    /**
//     * 按名字找书
//     * @param name 书名
//     * @return 书列表
//     */
//    public List<Book> getByName(String name){
//        List<Book> books = new LinkedList<>();
//        for (Book book : list) {
//            if(book.getName().equals(name)){
//                books.add(book);
//            }
//        }
//        return books;
//    }
//
//    /**
//     * 按id找书
//     * @param id 书的id
//     * @return 找得到book，找不到null
//     */
//    public Book getById(int id){
//        for (Book book : list) {
//            if(book.getId() == id){
//                return book;
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 按类别id找书
//     * @param btId 书类id
//     * @return 找到的书
//     */
//    public List<Book> getBooksByTypeId(int btId){
//        //lambda挺好用
//        return list.stream().filter(e -> e.getTypeId() == btId).toList();
//    }
//
//    /**
//     * 返回按多个类别找书，但是控制台里，怎么会用到这个方法呢
//     * @param ids 类别id列表
//     * @return 找到的书
//     */
//    public List<Book> getBooksByTypeIds(ArrayList<Integer> ids){
//        //书的类别一定比较少，就用set存，防止遍历，O1
//        Set<Integer> idSet = new HashSet<>(ids);
//        //如果idSet里有这个类别，就加入list
//        return list.stream().filter(e -> idSet.contains(e.getTypeId())).toList();
//    }
//
//    /**
//     * 按借阅者id查书，用于读者查找自己的书
//     * @param uid 读者的id
//     * @return 他借的书
//     */
//    public List<Book> getBooksByBorrowerId(int uid){
//        return list.stream().filter(e -> e.getBorrowerId() == uid).toList();
//    }
//
//    /**
//     * 把这个人借的书全还了
//     * @param uid
//     */
//    public void returnAllBookByUserId(int uid){
//        list.forEach((Book book)->{
//            if(book.getBorrowerId() == uid){
//                book.setBorrowerId(0);
//            }
//        });
//
//
//    }
//
//    /**
//     * 删除一类书
//     * @param id 类别的id
//     * @return 删除书的列表
//     */
//    public List<Book> deleteByTypeId(int id) {
//        List<Book> res = new LinkedList<>();
//        Iterator<Book> it = list.iterator();
//        while (it.hasNext()){
//            Book b = it.next();
//            if (b.getTypeId() == id) {
//                it.remove();
//                res.add(b);
//            }
//        }
//
//
//        return res;
//    }
//
//    /**
//     * 更新{@code oldId}类别的书为新类{@code id}
//     * @param oldId 旧类别id
//     * @param id 新的类别id
//     * @return 更改的书的列表
//     */
//    public List<Book> updateTypeId(int oldId, int id) {
//        List<Book> books = new LinkedList<>();
//        list.forEach(e->{
//            if(e.getTypeId() == oldId){
//                e.setTypeId(id);
//                books.add(e);
//            }
//        });
//
//
//        return books;
//    }
//
//    public boolean borrowBook(int bookId, int readerId) {
//        Book book = bookDao.getById(bookId);
//        if (book != null && book.getBorrowerId()==0) {
//            book.setBorrowerId(readerId);
//
//            return true;
//        }else {
//            return false;
//        }
//    }
//
//    /**
//     * 按id还书，如果id为0，还了所有的书
//     * @param id
//     * @return
//     */
//    public List<Book> returnMyBookById(int readerId, int id) {
//
//        List<Book> myBooks = getBooksByBorrowerId(readerId);
//        List<Book> returnedBooks = new LinkedList<>();
//        if(id == 0){
//            myBooks.forEach(book -> book.setBorrowerId(0));
//            return myBooks;
//        }else {
//            for (Book book : myBooks) {
//                if(book.getId() == id){
//                    book.setBorrowerId(0);
//                    returnedBooks.add(book);
//                    break;
//                }
//            }
//        }
//        return returnedBooks;
//    }
//
//    public void save(){
//        ioDealer.save(list);
//    }
//
//    public void updateTypeIdById(int id, int newId) {
//        Book book = getById(id);
//        book.setTypeId(newId);
//    }
//}
